Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


LXMF/Utilities/lxmd.py 64050d39bfa6c0dafe15c6b0fd2bd2f0bbd40549 (64050d39) Text, 22.84 KB

T8b949e#!/usr/bin/env python3

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2022 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Te6edf3DEFFERED_JOBS_DELAY Tff7b72= T79c0ff10
Te6edf3JOBS_INTERVAL Tff7b72= T79c0ff5

Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787argparse
Tff7b72import T7ee787threading
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787shlex
Tff7b72import T7ee787time
Tff7b72import T7ee787os

Tff7b72from T7ee787LXMFT7ee787.T7ee787_version Tff7b72import Te6edf3__version__

Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj

Te6edf3configpath Tff7b72= Tff7b72None
Te6edf3ignoredpath Tff7b72= Tff7b72None
Te6edf3identitypath Tff7b72= Tff7b72None
Te6edf3storagedir Tff7b72= Tff7b72None
Te6edf3lxmdir Tff7b72= Tff7b72None
Te6edf3targetloglevel Tff7b72= Tff7b72None

Te6edf3identity Tff7b72= Tff7b72None
Te6edf3lxmd_config Tff7b72= Tff7b72None
Te6edf3message_router Tff7b72= Tff7b72None
Te6edf3lxmf_destination Tff7b72= Tff7b72None
Te6edf3active_configuration Tff7b72= Tb4b4b4{Tb4b4b4}

Te6edf3last_peer_announce Tff7b72= Tff7b72None
Te6edf3last_node_announce Tff7b72= Tff7b72None

Tff7b72def Td2a8ffcreate_default_configTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Te6edf3lxmd_config Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_lxmd_config__Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3lxmd_configTff7b72.Td2a8fffilename Tff7b72= Te6edf3configpath
Te6edf3lxmd_configTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffapply_configTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72tryTb4b4b4:
T8b949e# Load peer settings
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffAnonymous PeerTa5d6ff"

Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False

Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)Tff7b72*T79c0ff60
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1024

Tff7b72if Ta5d6ff"Ta5d6fflxmfTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffon_inboundTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

T8b949e# Load propagation node settings
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffautopeerTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)Tff7b72*T79c0ff60
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.005Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.005
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff2000
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72< T79c0ff0.38Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0.38
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff256
Tff7b72if Ta5d6ff"Ta5d6ffpropagationTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Load various settings
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Te6edf3lxmd_config Tff7b72and Ta5d6ff"Ta5d6ffloglevelTa5d6ff" Tff7b72in Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3targetloglevel Tff7b72= Te6edf3lxmd_configTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffloglevelTa5d6ff"Tb4b4b4)

Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ignoredpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Te6edf3ignoredpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3ignored_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3ignored_hash_strs Tff7b72= Te6edf3ignored_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)

Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3ignored_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ignored_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ignored_hashTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while loading list of ignored destinations: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3allowedpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Te6edf3allowedpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3allowed_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3allowed_hash_strs Tff7b72= Te6edf3allowed_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)

Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3allowed_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3allowed_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3allowed_hashTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while loading list of allowed identities: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not apply LXM Daemon configuration. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Te6edf3e
Te6edf3exitTb4b4b4(T79c0ff3Tb4b4b4)

Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Te6edf3lxmTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3lxmdir

Tff7b72tryTb4b4b4:
Te6edf3written_path Tff7b72= Te6edf3lxmTff7b72.Td2a8ffwrite_to_directoryTb4b4b4(Te6edf3lxmdirTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff written to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3written_pathTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCalling external program to handle messageTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3command Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffon_inboundTa5d6ff"Tb4b4b4]
Te6edf3processing_command Tff7b72= Te6edf3commandTff7b72+Ta5d6ff"Ta5d6ff Tffea00\"Ta5d6ff"Tff7b72+Te6edf3written_pathTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff"
Te6edf3return_code Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffcallTb4b4b4(Te6edf3shlexTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3processing_commandTb4b4b4)Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo action defined for inbound messages, ignoringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError occurred while processing received message Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3lxmTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)


Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3run_pn Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3on_inbound Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3quietness Tff7b72= T79c0ff0Tb4b4b4, Te6edf3service Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3configpathTb4b4b4, Te6edf3ignoredpathTb4b4b4, Te6edf3identitypathTb4b4b4, Te6edf3allowedpathTb4b4b4, Te6edf3storagedirTb4b4b4, Te6edf3lxmdir
Tff7b72global Te6edf3lxmd_configTb4b4b4, Te6edf3active_configurationTb4b4b4, Te6edf3targetloglevel
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination

Tff7b72if Te6edf3serviceTb4b4b4:
Te6edf3targetlogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_FILE
Te6edf3targetloglevel Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3targetlogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT

T8b949e# Get configuration
Tff7b72if Te6edf3configdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/lxmdTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmd/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/lxmdTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.lxmdTa5d6ff"

Te6edf3configpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Te6edf3ignoredpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/ignoredTa5d6ff"
Te6edf3allowedpath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/allowedTa5d6ff"
Te6edf3identitypath Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/identityTa5d6ff"
Te6edf3storagedir Tff7b72= Te6edf3configdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Te6edf3lxmdir Tff7b72= Te6edf3storagedirTff7b72+Ta5d6ff"Ta5d6ff/messagesTa5d6ff"

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3storagedirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3storagedirTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3lxmdirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3lxmdirTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load config file, creating default configuration file...Ta5d6ff"Tb4b4b4)
Te6edf3create_default_configTb4b4b4(Te6edf3configpathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDefault config file created. Make any necessary changes in Ta5d6ff"Tff7b72+Te6edf3configpathTff7b72+Ta5d6ff"Ta5d6ff and restart lxmd if needed.Ta5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.5Tb4b4b4)

Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3configpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3lxmd_config Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3configpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Te6edf3configpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Te6edf3apply_configTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConfiguration loaded from Ta5d6ff"Tff7b72+Te6edf3configpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72if Te6edf3targetloglevel Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3targetloglevel Tff7b72= T79c0ff3

Tff7b72if Te6edf3verbosity Tff7b72!= T79c0ff0 Tff7b72or Te6edf3quietness Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3targetloglevel Tff7b72= Te6edf3targetloglevelTff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
T8b949e# Start Reticulum
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSubstantiating Reticulum...Ta5d6ff"Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4, Te6edf3logdestTff7b72=Te6edf3targetlogdestTb4b4b4)

T8b949e# Generate or load primary identity
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identitypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff4Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Te6edf3identitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo Primary Identity file found, creating new...Ta5d6ff"Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new Primary IdentityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
T8b949e# Start LXMF
Te6edf3message_router Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTb4b4b4(
Te6edf3identity Tff7b72= Te6edf3identityTb4b4b4,
Te6edf3storagepath Tff7b72= Te6edf3storagedirTb4b4b4,
Te6edf3autopeer Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeerTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3autopeer_maxdepth Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffautopeer_maxdepthTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3propagation_limit Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3delivery_limit Tff7b72= Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdelivery_transfer_max_accepted_sizeTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Te6edf3lxmf_deliveryTb4b4b4)

Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffignored_lxmf_destinationsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffignore_destinationTb4b4b4(Te6edf3destination_hashTb4b4b4)

Te6edf3lxmf_destination Tff7b72= Te6edf3message_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3display_nameTff7b72=Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTb4b4b4(
Te6edf3packet_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3public_keyTff7b72=Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3app_dataTff7b72=Tff7b72None
Tb4b4b4)

T8b949e# Set up authentication
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffauth_requiredTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffset_authenticationTb4b4b4(Te6edf3requiredTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClint authentication was enabled, but no identity hashes could be loaded from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3allowedpathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Nobody will be able to sync messages from this propagation node.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffallowTb4b4b4(Te6edf3identity_hashTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Router ready to receive on Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3run_pn Tff7b72or Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffenable_propagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffset_message_storage_limitTb4b4b4(Te6edf3megabytesTff7b72=Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72for Te6edf3dest_str Tff7b72in Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffprioritised_lxmf_destinationsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3dest_strTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dest_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Te6edf3message_routerTff7b72.Td2a8ffprioritiseTb4b4b4(Te6edf3dest_hashTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCannot prioritise Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3dest_strTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, it is not a valid destination hashTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3message_routerTff7b72.Td2a8ffenable_propagationTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Propagation Node started on Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3message_routerTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarted lxmd version Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)

Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3deferred_start_jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)

Tff7b72def Td2a8ffjobsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3last_peer_announceTb4b4b4, Te6edf3last_node_announce
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff" Tff7b72in Te6edf3active_configuration Tff7b72and Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3last_peer_announce Tff7b72+ Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_intervalTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF delivery destinationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3last_peer_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff" Tff7b72in Te6edf3active_configuration Tff7b72and Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3last_node_announce Tff7b72+ Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_intervalTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF Propagation NodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3last_node_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while running periodic jobs. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3JOBS_INTERVALTb4b4b4)

Tff7b72def Td2a8ffdeferred_start_jobsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3active_configurationTb4b4b4, Te6edf3last_peer_announceTb4b4b4, Te6edf3last_node_announce
Tff7b72global Te6edf3message_routerTb4b4b4, Te6edf3lxmf_destination
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3DEFFERED_JOBS_DELAYTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRunning deferred start jobsTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffpeer_announce_at_startTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF delivery destinationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3lxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)

Tff7b72if Te6edf3active_configurationTb4b4b4[Ta5d6ff"Ta5d6ffnode_announce_at_startTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending announce for LXMF Propagation NodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3message_routerTff7b72.Td2a8ffannounce_propagation_nodeTb4b4b4(Tb4b4b4)

Te6edf3last_peer_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3last_node_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffLightweight Extensible Messaging DaemonTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative lxmd config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--rnsconfigTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-pTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--propagation-nodeTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrun an LXMF Propagation NodeTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--on-inboundTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffPATHTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffexecutable to run when a message is receivedTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--verboseTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-qTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--quietTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--serviceTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fflxmd is running as a service and should log to fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--exampleconfigTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffprint verbose configuration example to stdout and exitTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6fflxmd Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3argsTff7b72.Td2a8ffexampleconfigTb4b4b4:
Tffa657printTb4b4b4(Te6edf3__default_lxmd_config__Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)

Te6edf3program_setupTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdirTff7b72=Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3run_pnTff7b72=Te6edf3argsTff7b72.Td2a8ffpropagation_nodeTb4b4b4,
Te6edf3on_inboundTff7b72=Te6edf3argsTff7b72.Td2a8ffon_inboundTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3serviceTff7b72=Te6edf3argsTff7b72.Td2a8ffservice
Tb4b4b4)

Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)

Te6edf3__default_lxmd_config__ Tff7b72= Ta5d6ff"""Ta5d6ff# This is an example LXM Daemon config file.
Ta5d6ff# You should probably edit it to suit your
Ta5d6ff# intended usage.

Ta5d6ff[propagation]

Ta5d6ff# Whether to enable propagation node

Ta5d6ffenable_node = no

Ta5d6ff# Automatic announce interval in minutes.
Ta5d6ff# 6 hours by default.

Ta5d6ffannounce_interval = 360

Ta5d6ff# Whether to announce when the node starts.

Ta5d6ffannounce_at_start = yes

Ta5d6ff# Wheter to automatically peer with other
Ta5d6ff# propagation nodes on the network.

Ta5d6ffautopeer = yes

Ta5d6ff# The maximum peering depth (in hops) for
Ta5d6ff# automatically peered nodes.

Ta5d6ffautopeer_maxdepth = 4

Ta5d6ff# The maximum accepted transfer size per in-
Ta5d6ff# coming propagation transfer, in kilobytes.
Ta5d6ff# This also sets the upper limit for the size
Ta5d6ff# of single messages accepted onto this node.
Ta5d6ff#
Ta5d6ff# If a node wants to propagate a larger number
Ta5d6ff# of messages to this node, than what can fit
Ta5d6ff# within this limit, it will prioritise sending
Ta5d6ff# the smallest messages first, and try again
Ta5d6ff# with any remaining messages at a later point.

Ta5d6ffpropagation_transfer_max_accepted_size = 256

Ta5d6ff# The maximum amount of storage to use for
Ta5d6ff# the LXMF Propagation Node message store,
Ta5d6ff# specified in megabytes. When this limit
Ta5d6ff# is reached, LXMF will periodically remove
Ta5d6ff# messages in its message store. By default,
Ta5d6ff# LXMF prioritises keeping messages that are
Ta5d6ff# new and small. Large and old messages will
Ta5d6ff# be removed first. This setting is optional
Ta5d6ff# and defaults to 2 gigabytes.

Ta5d6ff# message_storage_limit = 2000

Ta5d6ff# You can tell the LXMF message router to
Ta5d6ff# prioritise storage for one or more
Ta5d6ff# destinations. If the message store reaches
Ta5d6ff# the specified limit, LXMF will prioritise
Ta5d6ff# keeping messages for destinations specified
Ta5d6ff# with this option. This setting is optional,
Ta5d6ff# and generally you do not need to use it.

Ta5d6ff# prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf

Ta5d6ff# By default, any destination is allowed to
Ta5d6ff# connect and download messages, but you can
Ta5d6ff# optionally restrict this. If you enable
Ta5d6ff# authentication, you must provide a list of
Ta5d6ff# allowed identity hashes in the a file named
Ta5d6ff# Ta5d6ff"Ta5d6ffallowedTa5d6ff"Ta5d6ff in the lxmd config directory.

Ta5d6ffauth_required = no


Ta5d6ff[lxmf]

Ta5d6ff# The LXM Daemon will create an LXMF destination
Ta5d6ff# that it can receive messages on. This option sets
Ta5d6ff# the announced display name for this destination.

Ta5d6ffdisplay_name = Anonymous Peer

Ta5d6ff# It is possible to announce the internal LXMF
Ta5d6ff# destination when the LXM Daemon starts up.

Ta5d6ffannounce_at_start = no

Ta5d6ff# You can also announce the delivery destination
Ta5d6ff# at a specified interval. This is not enabled by
Ta5d6ff# default.

Ta5d6ff# announce_interval = 360

Ta5d6ff# The maximum accepted unpacked size for mes-
Ta5d6ff# sages received directly from other peers,
Ta5d6ff# specified in kilobytes. Messages larger than
Ta5d6ff# this will be rejected before the transfer
Ta5d6ff# begins.

Ta5d6ffdelivery_transfer_max_accepted_size = 1024

Ta5d6ff# You can configure an external program to be run
Ta5d6ff# every time a message is received. The program
Ta5d6ff# will receive as an argument the full path to the
Ta5d6ff# message saved as a file. The example below will
Ta5d6ff# simply result in the message getting deleted as
Ta5d6ff# soon as it has been received.

Ta5d6ff# on_inbound = rm


Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 7:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Extreme logging

Ta5d6ffloglevel = 4

Ta5d6ff"""

Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────